﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using Sistema_Totem.Presentacion.Contrato.Requerimientos;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Logica.Comandos;
using Sistema_Totem.Logica.Fabricas;
using System.Web.UI.WebControls;

namespace Sistema_Totem.Presentacion.Presentador.Requerimientos
{
    public class PresentadorConsultarRequerimiento
    {
        #region Atributos

        /// <summary>
        /// Instancia del Contrato IContratoConsultarRequerimiento.
        /// </summary>
        private IContratoConsultarRequerimiento
            _iContratoConsultarRequerimiento;
        private List<Requerimiento> _requerimiento;
        private Comando<List<Requerimiento>> _comandoRequerimiento;

        #endregion Atributos

        #region Constructor

        public PresentadorConsultarRequerimiento
            (IContratoConsultarRequerimiento iContratoConsultarRequerimiento)
        {
            _iContratoConsultarRequerimiento = iContratoConsultarRequerimiento;
        }

        #endregion Constructor

        #region Metodos

        #region GV Consultar Requerimiento

        /// <summary>
        /// Método que llena el GV con todos los requerimientos asociados 
        /// a un Proyecto.
        /// </summary>
        /// <param name="requerimiento"></param>
        public void CargarTablaRequerimiento(List<Requerimiento> requerimiento)
        {
            try 
            {
                DataTable tabla = new DataTable();
                tabla.Columns.Add("Id", typeof(string));
                tabla.Columns.Add("Nombre", typeof(string));

                //Se recorre la lista de requerimientos 
                foreach (Requerimiento _req in requerimiento)
                {
                    string s = null;
                    int id = 0;
                    foreach (Seccion _seccion in _req.ListaSeccion)
                    {

                        foreach (ElementoControl _ele in _seccion.ListaControl)
                        {

                            if (_ele.Nombre == "Nombre")
                            {
                                id = _req.Id;
                                s = _ele.Contenido;
                            }
                        }
                    }
                    tabla.Rows.Add(id, s);
                }
                //Seteamos el gridview con el datatable de los requerimientos.
                _iContratoConsultarRequerimiento.GVBuscarRequerimiento.DataSource =
                    tabla;
                _iContratoConsultarRequerimiento.GVBuscarRequerimiento.DataBind();
            }

            catch (Exception error)
            {
                _iContratoConsultarRequerimiento.MensajeError.Text = error.Message;
                _iContratoConsultarRequerimiento.MensajeError.Visible = true;
            }
            
        }

        #endregion GV Consultar Requerimiento

        #region Ocultar Columna GV

        /// <summary>
        /// Metodo que oculta la columna id del Requerimiento en el GV
        /// </summary>
        public void OcultarColumna()
        {
            _iContratoConsultarRequerimiento.GVBuscarRequerimiento.HeaderRow.
                Cells[0].Visible = false;
            foreach (GridViewRow row in _iContratoConsultarRequerimiento.
                GVBuscarRequerimiento.Rows)
            {
                row.Cells[0].Visible = false;
            }
        }

        #endregion Ocultar Columna GV

        #region Cargar GV Requerimiento

        /// <summary>
        /// Método que carga el GridView con los
        /// requerimientos asociados a un proyecto especico.
        /// </summary>
        /// <param name="idProyecto"></param>
        /// <returns></returns>
        public List<Requerimiento> BuscarDocumentosRequerimiento()
        {
            
            // llamamos a la variable session que contiene el id del proyecto actual
            Proyecto _miProyecto = (Proyecto)_iContratoConsultarRequerimiento.Sesion["proyecto"];
            // instanciamos un objeto del comandoConsultarRequerimiento
            _comandoRequerimiento = FabricaComando.CrearComandoConsultarRequerimiento(_miProyecto.IdProyecto);
            
            try 
            {
                // ejecutamos el comando
                _requerimiento = _comandoRequerimiento.Ejecutar();
                // llamamos al metodo para cargar la tabla de requerimientos
                CargarTablaRequerimiento(_requerimiento);
            }
            catch(Exception error)
            {
                _iContratoConsultarRequerimiento.MensajeError.Text = 
                    "Error: al consultar los requerimientos de este proyecto"+error.Message;
                _iContratoConsultarRequerimiento.MensajeError.Visible = true;
            }
            
            return _requerimiento;
        }

        #endregion Cargar GV Requerimiento

        #region Obtener Consulta del GV

        /// <summary>
        /// Método que recorre la lista de requerimiento
        /// y obtiene los valores de la fila seleccionada
        /// en el GridView.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="sessionR"></param>
        /// <returns></returns>
        public Requerimiento VerDetalleGV(int id, object sessionR)
        {
            Entidad requeP = FabricaEntidad.NuevoRequerimiento();
            // Recorremos la lista de los Requerimientos
            foreach (Requerimiento reque in ((List<Requerimiento>)sessionR))
            {
                // verificamos que el id del requerimiento este en la lista
                if (reque.Id == id)
                {
                    requeP = reque; 
                }
            }
            return (requeP as Requerimiento);
        }
        #endregion Obtener Obtener Consulta del GV

        #region Motor de Busqueda

        /// <summary>
        /// Método que implementa el moton de busqueda.
        /// </summary>
        /// <param name="requerimientos"></param>
        /// <param name="nombreRequerimiento"></param>
        public void buscarRequerimiento(object requerimientos, 
            string nombreRequerimiento)
        {
            List<Requerimiento> _requerimientos = requerimientos as List<Requerimiento>;
            List<Requerimiento> _requerimientosResultado = new List<Requerimiento>();
            foreach (Requerimiento _miRequerimiento in _requerimientos)
            {
                foreach (Seccion _miSeccion in _miRequerimiento.ListaSeccion)
                {
                    foreach (ElementoControl _miElemento in _miSeccion.ListaControl)
                    {
                        if ((_miElemento.Nombre == "Nombre") && 
                            (_miElemento.Contenido.Contains(nombreRequerimiento)))
                        {
                            _requerimientosResultado.Add(_miRequerimiento);
                        }
                    }
                }
            }
            CargarTablaRequerimiento(_requerimientosResultado);
            OcultarColumna();
        }

        #endregion Motor de Busqueda

        #endregion Metodos
    }
}